package cn.mrcode.smartFramework.test;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

/**
 * Created by zhuqiang on 2015/10/29 0029.
 */
public class MyThreadLocal<T> {
    Map<Thread, T> container = new ConcurrentHashMap<>();

    /** 返回此线程局部变量的当前线程副本中的值。 */
    public T get() {
        Thread ct = Thread.currentThread();
        if (container.containsKey(ct)) {
            return container.get(ct);
        } else { //如果没有值,就返回默认值
            return initialValue();
        }
    }

    /** 返回此线程局部变量的当前线程的“初始值”。 */
    protected T initialValue() {

        return null;
    }

    /** 移除此线程局部变量当前线程的值。 */
    public void remove() {
        Thread ct = Thread.currentThread();
        if (container.containsKey(ct)) {
            container.remove(ct);
        }
    }

    /** 将此线程局部变量的当前线程副本中的值设置为指定值。 */
    public void set(T value) {
        container.put(Thread.currentThread(), value);
    }

}

class Client{
    public static void main(String[] args) {
        MyThreadLocal<String> mt = new MyThreadLocal<>();
        new Thread(new Task(mt)).start();
        new Thread(new Task(mt)).start();
        new Thread(new Task(mt)).start();
    }
}

class Task implements Runnable{
    private MyThreadLocal<String> mt;

    public Task(MyThreadLocal<String> mt) {
        this.mt = mt;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(String.format("当前线程%s,mt中的value=%s", name,mt.get()));
        try {
            // 随机休眠,如果有线程并发问题.或则 如果这样还是共享的一个变量的话.就能看出来端倪
            TimeUnit.MILLISECONDS.sleep((long)(Math.random() * 1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mt.set(name);

        System.out.println(String.format("改变值后:当前线程%s,mt中的value=%s", name,mt.get()));
    }
}
